// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者，助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件，未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------

import request from "../utils/request.js";
import { uploadFile, UploadScene } from './upload.js';

/**
 * 获取企业列表
 * @param {Object} params - 查询参数
 * @param {String} params.name - 企业名称（模糊查询）
 * @param {String} params.status - 审核状态（0:审核中, 1:审核通过, 2:审核未通过）
 * @param {String} params.tags - 企业类别
 * @param {Number} params.page - 页码，默认1
 * @param {Number} params.limit - 每页数量，默认20
 * @returns {Promise}
 */
export function getEnterpriseList(params) {
	return request.get('enterprise/list', params);
}

/**
 * 获取企业详情
 * @param {Number} id - 企业ID
 * @returns {Promise}
 */
export function getEnterpriseDetail(id) {
	return request.get(`enterprise/detail/${id}`);
}

/**
 * 获取用户企业信息
 * @returns {Promise}
 */
export function getUserEnterprise() {
	return request.get('enterprise/user');
}

/**
 * 创建企业
 * @param {Object} data - 企业信息
 * @param {String} data.name - 企业全称（必填）
 * @param {String} data.license_file - 营业执照JSON字符串（必填）
 * @param {String} data.contact_name - 联系人（必填）
 * @param {String} data.contact_phone - 联系电话（必填）
 * @param {String} data.tags - 企业类别（多个用逗号分隔）
 * @param {String} data.funding_stage - 融资阶段
 * @param {String} data.staff_size - 人员规模
 * @param {String} data.nature - 公司性质
 * @param {String} data.address - 公司地址
 * @param {String} data.description - 公司描述
 * @param {String} data.logo_files - 企业Logo文件JSON字符串
 * @param {String} data.cert_file - 认证体系文件JSON字符串
 * @param {String} data.agent_file - 代理证书JSON字符串
 * @returns {Promise}
 */
export function createEnterprise(data) {
	return request.post('enterprise/create', data);
}

/**
 * 修改企业信息
 * @param {Number} id - 企业ID
 * @param {Object} data - 企业信息（字段同创建企业）
 * @returns {Promise}
 */
export function updateEnterprise(id, data) {
	return request.post(`enterprise/edit/${id}`, data);
}

/**
 * 加入企业
 * @param {Number} enterpriseId - 要加入的企业ID
 * @returns {Promise}
 */
export function joinEnterprise(enterpriseId) {
	return request.post('enterprise/join', {
		enterprise_id: enterpriseId
	});
}

/**
 * 退出企业
 * @returns {Promise}
 */
export function quitEnterprise() {
	return request.post('enterprise/quit');
}

/**
 * 转让企业
 * @param {Number} id - 企业ID
 * @param {Number} toUid - 新创建者的用户ID
 * @returns {Promise}
 */
export function transferEnterprise(id, toUid) {
	return request.post(`enterprise/transfer/${id}`, {
		to_uid: toUid
	});
}

/**
 * 移除企业成员
 * @param {Number} id - 企业ID
 * @param {Number} memberUid - 要移除的成员用户ID
 * @returns {Promise}
 */
export function removeMember(id, memberUid) {
	return request.post(`enterprise/remove_member/${id}`, {
		member_uid: memberUid
	});
}

/**
 * 获取企业成员列表
 * @param {Number} id - 企业ID
 * @returns {Promise}
 */
export function getEnterpriseMembers(id) {
	return request.get(`enterprise/members/${id}`);
}

// ==================== 文件上传相关接口 ====================

/**
 * 上传企业Logo
 * @param {String} filePath - 要上传的文件路径
 * @param {Function} onProgressUpdate - 上传进度回调函数（可选）
 * @returns {Promise}
 */
export function uploadEnterpriseLogo(filePath, onProgressUpdate) {
	return uploadFile(filePath, UploadScene.PRODUCT_IMAGE, onProgressUpdate);
}

/**
 * 上传营业执照
 * @param {String} filePath - 要上传的文件路径
 * @param {Function} onProgressUpdate - 上传进度回调函数（可选）
 * @returns {Promise}
 */
export function uploadLicense(filePath, onProgressUpdate) {
	return uploadFile(filePath, UploadScene.QUALIFICATION, onProgressUpdate);
}

/**
 * 上传认证体系文件
 * @param {String} filePath - 要上传的文件路径
 * @param {Function} onProgressUpdate - 上传进度回调函数（可选）
 * @returns {Promise}
 */
export function uploadCert(filePath, onProgressUpdate) {
	return uploadFile(filePath, UploadScene.QUALIFICATION, onProgressUpdate);
}

/**
 * 上传代理证书
 * @param {String} filePath - 要上传的文件路径
 * @param {Function} onProgressUpdate - 上传进度回调函数（可选）
 * @returns {Promise}
 */
export function uploadAgent(filePath, onProgressUpdate) {
	return uploadFile(filePath, UploadScene.QUALIFICATION, onProgressUpdate);
}

/**
 * 批量上传企业文件
 * @param {Array} filePaths - 文件路径数组
 * @param {String} scene - 上传场景，使用 UploadScene 枚举（如 UploadScene.ENTERPRISE_LOGO）
 * @param {Function} onProgressUpdate - 总体进度回调函数（可选）
 * @returns {Promise} 返回包含所有上传结果的Promise
 */
export function uploadMultipleEnterpriseFiles(filePaths, scene, onProgressUpdate) {
	if (!Array.isArray(filePaths) || filePaths.length === 0) {
		return Promise.reject('文件列表不能为空');
	}

	let completedCount = 0;
	const total = filePaths.length;

	const uploadPromises = filePaths.map((filePath, index) => {
		return uploadFile(filePath, scene, (res) => {
			// 单个文件上传进度
			if (typeof onProgressUpdate === 'function') {
				const overallProgress = Math.floor(
					((completedCount + res.progress / 100) / total) * 100
				);
				onProgressUpdate({
					index,
					fileProgress: res.progress,
					overallProgress,
					completedCount,
					total
				});
			}
		}).then(result => {
			completedCount++;
			return result;
		});
	});

	return Promise.all(uploadPromises);
}

/**
 * 选择并上传企业图片
 * @param {Object} options - 选择图片的配置
 * @param {Number} options.count - 最多可以选择的图片张数，默认1
 * @param {Array} options.sizeType - 所选的图片的尺寸，默认['original', 'compressed']
 * @param {Array} options.sourceType - 选择图片的来源，默认['album', 'camera']
 * @param {String} scene - 上传场景，使用 UploadScene 枚举（如 UploadScene.ENTERPRISE_LOGO）
 * @param {Function} onProgressUpdate - 上传进度回调函数（可选）
 * @returns {Promise} 返回上传结果
 */
export function chooseAndUploadEnterpriseImage(options = {}, scene = UploadScene.ENTERPRISE_LOGO, onProgressUpdate) {
	return new Promise((resolve, reject) => {
		wx.chooseImage({
			count: options.count || 1,
			sizeType: options.sizeType || ['original', 'compressed'],
			sourceType: options.sourceType || ['album', 'camera'],
			success: (res) => {
				const tempFilePaths = res.tempFilePaths;
				
				if (tempFilePaths.length === 1) {
					// 单张图片直接上传
					uploadFile(tempFilePaths[0], scene, onProgressUpdate)
						.then(resolve)
						.catch(reject);
				} else {
					// 多张图片批量上传
					uploadMultipleEnterpriseFiles(tempFilePaths, scene, onProgressUpdate)
						.then(resolve)
						.catch(reject);
				}
			},
			fail: (err) => {
				console.error('选择图片失败：', err);
				reject('选择图片失败');
			}
		});
	});
}

/**
 * 将文件URL数组转换为JSON字符串（用于提交接口）
 * @param {Array} fileUrls - 文件URL数组
 * @returns {String} JSON字符串
 */
export function convertFilesToJson(fileUrls) {
	if (!Array.isArray(fileUrls)) {
		return '[]';
	}
	return JSON.stringify(fileUrls);
}

/**
 * 将JSON字符串转换为文件URL数组（用于解析接口返回数据）
 * @param {String} jsonString - JSON字符串
 * @returns {Array} 文件URL数组
 */
export function parseFilesJson(jsonString) {
	// 检查输入是否有效
	if (!jsonString || jsonString === 'undefined' || jsonString === 'null' || typeof jsonString !== 'string') {
		return [];
	}
	
	try {
		const result = JSON.parse(jsonString);
		return Array.isArray(result) ? result : [];
	} catch (e) {
		console.error('解析文件JSON失败：', e, '输入字符串:', jsonString);
		return [];
	}
}

/**
 * 辅助函数：处理上传结果并转换为JSON字符串格式
 * @param {Object|Array} uploadResult - 上传接口返回的结果
 * @returns {String} JSON字符串格式的URL数组
 */
export function formatUploadResult(uploadResult) {
	// 单个文件上传结果
	if (uploadResult && uploadResult.data && uploadResult.data.url) {
		return convertFilesToJson([uploadResult.data.url]);
	}
	
	// 批量上传结果
	if (Array.isArray(uploadResult)) {
		const urls = uploadResult
			.filter(item => item && item.data && item.data.url)
			.map(item => item.data.url);
		return convertFilesToJson(urls);
	}
	
	return '[]';
}

